home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / fncsrc / raster.has < prev    next >
Text File  |  1995-08-22  |  18KB  |  1,112 lines

  1.  
  2.  
  3.     .include    doscall.mac
  4.     .include    iocscall.mac
  5.     .include    fefunc.h
  6.     .include    fdef.h
  7.  
  8.  
  9. CRTC_R09        equ    $e80012
  10. TEXT_scroll_reg        equ    $e80014
  11. GR0_scroll_reg        equ    $e80018
  12. GR1_scroll_reg        equ    $e8001c
  13. GR2_scroll_reg        equ    $e80020
  14. GR3_scroll_reg        equ    $e80024
  15. BG0_scroll_reg        equ    $eb0800
  16. BG1_scroll_reg        equ    $eb0804
  17.  
  18. CRTC_R0            equ    $e82400
  19. CRTC_R1            equ    $e82500
  20. CRTC_R2            equ    $e82600
  21.  
  22. MFP            equ    $e88000
  23. MFP_IERA        equ    $e88007
  24. MFP_IERB        equ    $e88009
  25. MFP_IMRA        equ    $e88013
  26.  
  27. V_DISP_ADR    equ    $134
  28. CRTC_RAS_ADR    equ    $138
  29. H_SYNC_ADR    equ    $13c
  30.  
  31.  * ZMUSIC -M : 多重割り込み対応
  32.  
  33.  
  34.  
  35. DIsuper    .macro
  36.     suba.l    a1,a1
  37.     IOCS    _B_SUPER
  38.     move.l    d0,-(sp)
  39.     ori.w    #$0700,sr    * 割り込み禁止
  40.     .endm
  41. EIsuper    .macro
  42.     andi.w    #$f8ff,sr    * 割り込み許可
  43.     movea.l    (sp)+,a1
  44.     IOCS    _B_SUPER
  45.     .endm
  46.  
  47.  
  48.  
  49.  
  50.  
  51.     .text
  52.     .even
  53.  
  54.     .dc.l    init
  55.     .dc.l    ret
  56.     .dc.l    break_end
  57.     .dc.l    exit
  58.     .dc.l    break_end
  59.     .dc.l    ret
  60.     .dc.l    ret
  61.     .dc.l    ret
  62.     .dc.l    ptr_token
  63.     .dc.l    ptr_param
  64.     .dc.l    ptr_exec
  65.     .dc.l    0,0,0,0,0
  66.  
  67. ret:
  68.     rts
  69.  
  70.  
  71.  
  72.  
  73. init:
  74.     DIsuper
  75.         cmpi.l    #$1000000,V_DISP_ADR.w        * V_DISP の割り込み先
  76.         bcs    @f
  77. *        cmpi.l    #$1000000,CRTC_RAS_ADR.w    * CRTC-RAS の割り込み先
  78. *        bcs    @f
  79.         cmpi.l    #$1000000,H_SYNC_ADR.w        * H-SYNC の割り込み先
  80.         bcs    @f
  81.         move.l    V_DISP_ADR.w,vdisp_bak
  82. *        move.l    CRTC_RAS_ADR.w,crtcras_bak    * 保存
  83.         move.l    H_SYNC_ADR.w,hsync_bak
  84.         move.b    MFP_IERB,mfp_ierb_bak
  85.         clr.w    ras_flag        * raster scroll でけまっせ
  86.         move.b    #$0_1,$1f+MFP        * 垂直帰線期間 & カウンタ1
  87.  
  88.         move.l    #$0003_ff00,d1        * PCM8(A) が常駐していれば、マスクの書き替え
  89.         bsr    pcm8_check        * thanks for philly さん
  90.         move.l    d0,pcm8_mask
  91.  
  92. @@:
  93.     EIsuper
  94.     rts
  95.  
  96.  
  97.  
  98. break_end:
  99.     move.w    ras_flag(pc),d0
  100.     bne    exit_ret
  101.  
  102.     move.w    #-1,loop_num    * 終わりの印
  103. *    move.w    #-1,ras_screen    * 終わりの印
  104.  
  105.     DIsuper
  106.         lea.l    MFP,a0
  107.  
  108.         moveq    #%0001_1111,d0        * H-SYNC, CRTC-RAS, V_DISP
  109. *        moveq    #%0011_1111,d0        * H-SYNC, CRTC-RAS
  110.         and.b    d0,7(a0)        * 割り込み発生禁止
  111.         and.b    d0,$13(a0)        * 割り込み要求のマスク
  112.  
  113.         move.b    mfp_ierb_bak(pc),9(a0)
  114.     EIsuper
  115.     rts
  116.  
  117.  
  118.  
  119. exit:
  120.     move.w    ras_flag(pc),d0
  121.     bne    exit_ret
  122.  
  123.     DIsuper
  124.         move.l    vdisp_bak(pc),V_DISP_ADR.w
  125. *        move.l    crtcras_bak(pc),CRTC_RAS_ADR.w    * 復帰
  126.         move.l    hsync_bak(pc),H_SYNC_ADR.w
  127.         move.b    mfp_ierb_bak(pc),MFP_IERB
  128.  
  129.         move.l    pcm8_mask(pc),d1    * PCM8(A) が常駐していれば、マスクの復活
  130.         bsr    pcm8_check        * thanks for philly さん
  131.     EIsuper
  132. exit_ret:
  133.     rts
  134.  
  135.  
  136. ras_flag:    .dc.w    -1
  137. vdisp_bak:    .dc.l    0
  138. crtcras_bak:    .dc.l    0
  139. hsync_bak:    .dc.l    0
  140. mfp_ierb_bak:    .dc.b    0,0
  141. pcm8_mask:    .dc.l    0
  142.  
  143.  
  144.  
  145.  
  146. pcm8_check:
  147.     movea.l    $88.w,a0        * PCM8(A) 常駐チェック
  148.     cmpi.l    #'PCM8',-8(a0)
  149.     bne    @f
  150.     cmpi.b    #'/',-4(a0)
  151.     bne    @f
  152.         move.w    #$01fb,d0    * MPU・MFPマスク設定
  153.         trap    #2        * PCM8(A)ファンクションコール
  154. @@:
  155.     rts
  156.  
  157.  
  158.  
  159.  
  160. **    **    **    **    **    **    **    **    **    **
  161.  
  162. ptr_token:
  163.     .dc.b    'ras_scroll_set',0
  164.     .dc.b    'ras_home',0
  165.     .dc.b    'ras_scroll_stat',0
  166.     .dc.b    'v_priority',0
  167.     .dc.b    'v_special',0
  168.     .dc.b    'v_disp',0
  169.     .dc.b    0
  170.     .even
  171.  
  172. ptr_param:
  173.     .dc.l    p_ras_scroll_set
  174.     .dc.l    p_ras_home
  175.     .dc.l    p_ras_scroll_stat
  176.     .dc.l    p_v_priority
  177.     .dc.l    p_v_special
  178.     .dc.l    p_v_disp
  179.  
  180. ptr_exec:
  181.     .dc.l    e_ras_scroll_set
  182.     .dc.l    e_ras_home
  183.     .dc.l    e_ras_scroll_stat
  184.     .dc.l    e_v_priority
  185.     .dc.l    e_v_special
  186.     .dc.l    e_v_disp
  187.  
  188.  
  189.  
  190. **    **    **    **    **    **    **    **    **    **
  191. p_v_priority:
  192.     .dc.w    str_omt
  193.     .dc.w    str_omt
  194.     .dc.w    void_ret
  195. e_v_priority:
  196.     tst.w    par1(sp)
  197.     bmi    v_pri_1
  198.     movea.l    par1+6(sp),a0
  199.     lea.l    v_pri_buf(pc),a2
  200.     moveq    #-1,d2
  201.     move.l    d2,(a2)
  202.     moveq    #0,d2
  203. 1:
  204.         move.b    (a0)+,d0
  205.         beq    2f
  206.         ori.b    #$20,d0
  207.         moveq    #0,d3
  208.         cmpi.b    #'s',d0
  209.         beq    @f
  210.         moveq    #1,d3
  211.         cmpi.b    #'t',d0
  212.         beq    @f
  213.         moveq    #2,d3
  214.         cmpi.b    #'g',d0
  215.         bne    para1_err
  216.     @@:
  217.             tst.b    (a2,d3.w)
  218.             bge    para1_err
  219.             move.b    d2,(a2,d3.w)
  220.     3:
  221.         addq.w    #1,d2
  222.         bra    1b
  223. 2:
  224.     subq.w    #3,d2
  225.     bne    para1_err
  226.  
  227.     moveq    #0,d1
  228.     moveq    #2,d0
  229. 3:
  230.     lsl.w    #2,d1
  231.     or.b    (a2)+,d1
  232.     dbra    d0,3b
  233.     lea.l    CRTC_R1,a1
  234.     IOCS    _B_BPOKE        * CTRC_R1 に書き込み
  235. v_pri_1:
  236.  
  237.  
  238.     tst.w    par2(sp)
  239.     bmi    v_pri_2
  240.  
  241.     movea.l    par2+6(sp),a0
  242.     lea.l    v_pri_buf(pc),a2
  243.     moveq    #-1,d2
  244.     move.l    d2,(a2)
  245.     moveq    #0,d2
  246.  
  247.     lea.l    CRTC_R0,a1
  248.     IOCS    _B_WPEEK
  249.     and.w    #$7,d0
  250.     moveq    #0,d4
  251.     move.b    _graph枚数(pc,d0.w),d4
  252.     ble    v_pri_2            * グラフィックが1枚しかない時は無効
  253. 1:
  254.         moveq    #0,d0
  255.         move.b    (a0)+,d0
  256.         beq    2f
  257.         subi.b    #'0',d0
  258.         bcs    para2_err
  259.         cmp.b    d4,d0
  260.         bhi    para2_err
  261.         tst.b    (a2,d0.w)
  262.         bge    para2_err
  263.         move.b    d2,(a2,d0.w)    * d0 ページの優先順位は d2 (0-3)
  264.         addq.w    #1,d2
  265.         bra    1b
  266. 2:
  267.     subq.w    #1,d2
  268.     cmp.w    d4,d2
  269.     bne    para2_err
  270.     subq.w    #1,d2
  271.     beq    _v_pri_2pages
  272. _v_pri_4pages:
  273.     moveq    #0,d1
  274.     moveq    #0,d2
  275. 3:
  276.         move.b    (a2)+,d0
  277.         add.w    d0,d0
  278.         move.b    d2,d3
  279.         lsl.w    d0,d3
  280.         or.b    d3,d1
  281.         addq.w    #1,d2
  282.         dbra    d4,3b
  283.     bra    page01
  284. _v_pri_2pages:
  285.     move.b    #%1110_0100,d1
  286.     cmpi.w    #$00_01,(a2)    * page0 > page1
  287.     beq    page01
  288.     cmpi.w    #$01_00,(a2)    * page0 < page1
  289.     bne    para2_err    * そんなはずはないはず
  290.     move.b    #%0100_1110,d1
  291. page01:
  292.     lea.l    CRTC_R1+1,a1
  293.     IOCS    _B_BPOKE        * CTRC_R1 に書き込み
  294. v_pri_2:
  295.     bra    return_zero
  296.  
  297.  
  298. v_pri_buf:
  299.     .dc.l    0
  300. _graph枚数:
  301.     .dc.b    4-1,2-1,0-1,1-1
  302.     .dc.b    1-1,1-1,1-1,1-1
  303.     .even
  304.  
  305.  
  306.  
  307.  
  308.  
  309. p_v_special:
  310.     .dc.w    int_val
  311.     .dc.w    int_ret
  312. e_v_special:
  313.     move.l    par1+6(sp),d1
  314.     bmi    @f
  315.     cmpi.l    #9,d1
  316.     bcc    para0_err
  317.  
  318.     suba.l    a1,a1
  319.     IOCS    _B_SUPER
  320.     movea.l    d0,a1
  321.         lea.l    CRTC_R2,a0
  322.         move.w    (a0),d0
  323.         and.w    #$80_ff,d0
  324.         add.w    d1,d1
  325.         or.w    _v_sp_table(pc,d1.w),d0
  326.         move.w    d0,(a0)
  327.     IOCS    _B_SUPER
  328.  
  329.     moveq    #0,d0
  330.     move.w    _v_special(pc),d0
  331.     move.w    par1+8(sp),_v_special
  332.     bra    return_d0
  333.  
  334. @@:
  335.     moveq    #0,d0
  336.     move.w    _v_special(pc),d0
  337.     bra    return_d0
  338.  
  339. _v_sp_table:
  340.     .dc.w    $0000        * OFF
  341.     .dc.w    $5c00        * TEXT PALET 0
  342.     .dc.w    $1d00        * T/S/B
  343.     .dc.w    $1e00        * G2
  344.     .dc.w    $1f00        * T/S/B + G2
  345.     .dc.w    $3d00        * T/S/B + TV/video
  346.     .dc.w    $3e00        * G2 + TV/video
  347.     .dc.w    $3f00        * T/S/B + G2 + TV/video
  348.     .dc.w    $1400        * special priority
  349.  
  350. _v_special:
  351.     .dc.w    0        * status
  352.  
  353.  
  354.  
  355. p_v_disp:
  356.     .dc.w    int_omt
  357.     .dc.w    void_ret
  358.  
  359. e_v_disp:
  360.     suba.l    a1,a1
  361.     IOCS    _B_SUPER
  362.     move.l    d0,a1
  363.  
  364.     lea.l    $e88001,a0
  365.     moveq    #4,d0
  366.  
  367.     tst.w    par1(sp)
  368.     bmi    帰線待ち
  369.     tst.l    par1+6(sp)
  370.     beq    帰線待ち
  371. 表示待ち:
  372. @@:
  373.     btst.b    d0,(a0)        * 帰線待ち
  374.     bne    @b
  375. @@:
  376.     btst.b    d0,(a0)        * 表示待ち
  377.     beq    @b
  378.  
  379.     IOCS    _B_SUPER
  380.     rts
  381.  
  382. 帰線待ち:
  383. @@:
  384.     btst.b    d0,(a0)        * 表示待ち
  385.     beq    @b
  386. @@:
  387.     btst.b    d0,(a0)        * 帰線待ち
  388.     bne    @b
  389.  
  390.     IOCS    _B_SUPER
  391.     rts
  392.  
  393.  
  394. **    **    **    **    **    **    **    **    **    **
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402. p_ras_scroll_set:
  403.     .dc.w    int_val        * 面 (0,1=BG0,1, 2,3,4,5=GRAPH0,1,2,3, 6=TEXT)
  404.     .dc.w    $0072        * int型 1,2 次元配列  ras(n,d)
  405.     .dc.w    int_omt        * 最大ページ番号 (0,1,2,...,n)
  406.     .dc.w    int_omt        * 各ページのラスターの指定本数 - 1  (0,1,...,d)
  407.     .dc.w    int_omt        * スクロール開始ラスター
  408.     .dc.w    int_ret
  409.  
  410.  
  411. _v_disp_tbl:
  412.     .dc.l    _v_disp0    * BG0 (X)
  413.     .dc.l    _v_disp1    * BG1 (X)
  414.     .dc.l    _v_disp2    * BG0 (XY)
  415.     .dc.l    _v_disp3    * BG1 (XY)
  416.     .dc.l    _v_disp4    * GRAPH 0
  417.     .dc.l    _v_disp5    * TEXT
  418.     .dc.l    _v_disp6    * BG0 (XY,diff)
  419.     .dc.l    _v_disp7    * BG1 (XY,diff)
  420.  
  421. e_ras_scroll_set:
  422.     move.w    ras_flag(pc),d0
  423.     bne    no_ras_err
  424.     move.l    par1+6(sp),d2        * 面
  425.     bmi    irregal_screen
  426.     move.l    d2,d0
  427.     subq.l    #8,d0
  428.     bcc    irregal_screen
  429.  
  430.     move.w    loop_num(pc),d0        * -1 : スクロール停止
  431.     bge    既にscroll        * スクロール止めてからでないとダメ
  432.     move.w    d2,ras_screen
  433.  
  434.  
  435.  * 垂直帰線割り込みアドレスセット
  436.     lsl.w    #2,d2
  437.     movea.l    _v_disp_tbl(pc,d2.w),a2
  438.  
  439.     move.w    ras_screen(pc),d0
  440.     subq.w    #4,d0
  441.     bne    @f
  442.  * GRAPHIC は 1/2/4 枚、65536色などなどで処理を分けないと
  443.         lea.l    CRTC_R0,a1
  444.         IOCS    _B_WPEEK
  445.         andi.w    #$7,d0
  446.         subq.w    #4,d0
  447.         bcc    @f        * GRAPH1024ならOK
  448.         lea.l    4+_graph枚数(pc),a0
  449.         move.b    (a0,d0.w),d0
  450.         beq    GRAPH65536
  451.         subq.b    #1,d0
  452.         *beq    GRAPH2枚
  453.         bne    @f        * GRAPH4枚ならOK
  454.     GRAPH2枚:
  455.             lea.l    _v_dispG00(pc),a2
  456.             bra    @f
  457.     GRAPH65536:
  458.             lea.l    _v_dispG0000(pc),a2
  459. @@:
  460.     lea.l    V_DISP_ADR.w,a1
  461.     move.l    a2,d1
  462.     IOCS    _B_LPOKE
  463.  
  464.  
  465.     clr.l    ras_home
  466.  
  467.  
  468.     movea.l    par2+6(sp),a1        * page data の収められている配列
  469.     move.w    4(a1),d0    * 次元 -1
  470.     add.w    d0,d0
  471.     move.w    d0,d2
  472.     add.w    d0,d0
  473.     add.w    d2,d0    * 6n-6
  474.     lea.l    4+6(a1,d0.w),a0        * data 先頭
  475.     move.l    a0,page_data
  476.  
  477.  
  478.     tst.w    par3(sp)
  479.     bge    1f
  480.     tst.w    d2
  481.     beq    no_param
  482.     move.w    8(a1),d0        * 1つ目の添字の大きさ
  483.     bra    2f
  484. 1:
  485.     move.l    par3+6(sp),d0        * 最大ページ番号 (0,1,2,...,n)
  486.     cmpi.l    #$10000,d0
  487.     bcc    para3_err
  488. 2:
  489.     move.w    d0,max_page_num
  490.  
  491.     tst.w    par4(sp)
  492.     bge    1f
  493.     tst.w    d2
  494.     beq    no_param
  495.     move.w    10(a1),d1        * 2つ目の添字の大きさ
  496.     bra    2f
  497. 1:
  498.     move.l    par4+6(sp),d1        * 各ページのラスターの指定本数 - 1  (0,1,...,d)
  499.     cmpi.l    #$10000,d1
  500.     bcc    para4_err
  501. 2:
  502.     move.w    d1,page_raster_num
  503.  
  504.     addq.l    #1,d0
  505.     addq.l    #1,d1
  506.     FPACK    __UMUL
  507.     move.l    d0,d3
  508.  
  509.     moveq    #0,d0
  510.     move.w    8(a1),d0    * (第一)添え字の大きさ
  511.     addq.l    #1,d0
  512.     tst.w    d2
  513.     beq    @f
  514.     move.w    10(a1),d1
  515.     addq.l    #1,d1
  516.     FPACK    __UMUL
  517. @@:
  518.     cmp.l    d3,d0
  519.     bcs    指定大きすぎ
  520.  
  521.  
  522.  
  523.     moveq    #0,d0            * default
  524.     tst.w    par5(sp)
  525.     bmi    1f
  526.     move.l    par5+6(sp),d0        * スクロール開始ラスター
  527. 1:
  528.     move.w    d0,start_raster
  529.  
  530.  
  531.     bra    return_zero
  532.  
  533.  
  534.  
  535. 既にscroll:
  536.     moveq    #-2,d0
  537.     bra    return_d0
  538.  
  539.  
  540.  
  541. ras_screen:    .dc.w    -1
  542. page_data:    .dc.l    0
  543. max_page_num:    .dc.w    0
  544. ras_home:    .dc.w    0,0
  545.  
  546. page_raster_num:    .dc.w    0
  547. start_raster:        .dc.w    0
  548.  
  549.  
  550.  
  551.  
  552.  
  553. p_ras_home:
  554.     .dc.w    int_val        * X
  555.     .dc.w    int_omt        * Y
  556.     .dc.w    void_ret
  557. e_ras_home:
  558.     move.w    ras_flag(pc),d0
  559.     bne    no_ras_err
  560.  
  561.     lea.l    ras_home(pc),a0
  562.     move.w    par1+8(sp),d0
  563.     move.w    d0,(a0)+
  564.  
  565.     tst.w    par2(sp)
  566.     bmi    @f
  567.     move.w    par2+8(sp),d0
  568.     move.w    d0,(a0)+
  569. @@:
  570.     bra    return_zero
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577. p_ras_scroll_stat:
  578.     .dc.w    int_val        * command
  579.     .dc.w    int_omt        * the first page
  580.     .dc.w    int_omt        * the last page
  581.     .dc.w    int_omt        * loop numbers
  582.     .dc.w    int_ret
  583.  
  584. e_ras_scroll_stat:
  585.     move.w    ras_flag(pc),d0
  586.     bne    no_ras_err
  587.  
  588.     move.l    par1+6(sp),d0        * command
  589.     beq    scroll_stop
  590.     bmi    return_stat
  591.  
  592.     move.w    ras_screen(pc),d0
  593.     bmi    データ未セット
  594.  
  595.     tst.w    par2(sp)
  596.     bge    1f
  597.     moveq.l    #0,d2        * default
  598.     bra    2f
  599. 1:
  600.     move.l    par2+6(sp),d2        * the first page
  601. 2:
  602.     move.w    page_raster_num(pc),d1
  603.     addq.w    #1,d1
  604.     move.w    d2,d0
  605.     mulu.w    d1,d0
  606.     lsl.l    #2,d0
  607.     movea.l    page_data(pc),a0
  608.     adda.l    d0,a0
  609.     move.w    ras_screen(pc),d1
  610.     move.w    #%00000000_11001100,d0
  611.     btst    d1,d0
  612.     bne    @f
  613.         addq.l    #2,a0        ***
  614. @@:
  615.     move.l    a0,data0
  616.  
  617.  
  618.     tst.w    par3(sp)
  619.     bge    1f
  620.     moveq.l    #0,d0
  621.     move.w    max_page_num(pc),d0    * default
  622.     bra    2f
  623. 1:
  624.     move.l    par3+6(sp),d0        * the last page
  625.     cmpi.l    #$10000,d0
  626.     bcc    para3_err
  627.     cmp.w    max_page_num(pc),d0
  628.     bhi    para3_err
  629. 2:
  630.     sub.l    d2,d0
  631.     bcs    para2_err
  632.     move.w    d0,page0
  633.  
  634.  
  635.     moveq.l    #0,d0        * default
  636.     tst.w    par4(sp)
  637.     bmi    1f
  638.     move.l    par4+6(sp),d0        * loop numbers
  639.     bmi    para4_err
  640. 1:
  641.  
  642.     move.w    loop_num(pc),d1
  643.     bmi    ras_stat_init
  644.  
  645.     tst.w    d0
  646.     beq    @f
  647.     addq.w    #1,d0
  648. @@:
  649.     move.w    d0,loop_num
  650.     clr.w    page
  651.     bra    return_zero
  652.  
  653.  
  654.  
  655.  
  656. no_ras_err:
  657.     moveq    #-1,d0
  658.     bra    return_d0
  659.  
  660.  
  661. ras_stat_init:
  662.     move.w    d0,loop_num
  663.     move.l    data0,data
  664.     move.w    page0,page
  665.  
  666.  
  667.     DIsuper
  668.  
  669.         lea.l    MFP,a0
  670.  
  671.         moveq    #$20,d0        * vdisp
  672.         andi.b    #$ef,3(a0)        * 垂直帰線期間で割り込み
  673.         or.b    d0,7(a0)        * vdisp 割り込み発生許可
  674.         or.b    d0,$13(a0)        *       割り込み要求のマスク解除
  675.  
  676. *        moveq    #$40,d0
  677. **        or.b    d0,3(a0)        * crtcras 1->0 で割り込み発生
  678. *        andi.b    #$bf,3(a0)        * crtcras 0->1 で割り込み発生
  679. *        or.b    d0,7(a0)        * crtcras 割り込み発生許可
  680. *        or.b    d0,$13(a0)        *         割り込み要求のマスク解除
  681.  
  682. *        ori.b    #$80,3(a0)        * h-sync 1->0 で割り込み発生
  683. *        andi.b    #$7f,3(a0)        * h-sync 0->1 で割り込み発生
  684.         andi.b    #$7f,7(a0)        * h-sync  割り込み発生禁止
  685.         ori.b    #$80,$13(a0)        *         割り込み要求のマスクは解除
  686.  
  687.         move.b    #%00001110,9(a0)    * timer C/D 割り込み禁止
  688.  
  689.     EIsuper
  690.     bra    return_zero
  691.  
  692.  
  693.  
  694.  
  695. scroll_stop:
  696.     bsr    break_end
  697.     bra    return_zero
  698.  
  699. return_stat:
  700.     move.w    loop_num(pc),d0
  701.     ext.l    d0
  702.     bra    return_d0
  703.  
  704.  
  705. page0:        .dc.w    0
  706. data0:        .dc.l    0
  707. page:        .dc.w    0
  708. data:        .dc.l    0
  709. loop_num:    .dc.w    -1
  710.  
  711. ras:        .dc.w    0
  712. ras1:        .dc.w    0
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719. **    **    **    **    **    **    **    **    **    **
  720.  
  721.  
  722. _v_disp0:
  723.     ori.b    #$80,MFP_IERA        * h-sync  割り込み発生許可
  724.     move.l    #__hsync0,H_SYNC_ADR.w
  725.     move.l    page_raster_num(pc),ras        * 1 page 当たりのラスタ本数 - 1
  726. *    move.w    start_raster(pc),ras1
  727.     move.l    ras_home(pc),BG0_scroll_reg
  728.     rte
  729.  
  730.  
  731. _v_disp1:
  732.     ori.b    #$80,MFP_IERA
  733.     move.l    #__hsync1,H_SYNC_ADR.w
  734.     move.l    page_raster_num(pc),ras
  735.     move.l    ras_home(pc),BG1_scroll_reg
  736.     rte
  737.  
  738.  
  739. _v_disp2:
  740.     ori.b    #$80,MFP_IERA
  741.     move.l    #__hsync2,H_SYNC_ADR.w
  742.     move.l    page_raster_num(pc),ras
  743.     move.l    ras_home(pc),BG0_scroll_reg
  744.     rte
  745.  
  746.  
  747. _v_disp3:
  748.     ori.b    #$80,MFP_IERA
  749.     move.l    #__hsync3,H_SYNC_ADR.w
  750.     move.l    page_raster_num(pc),ras
  751.     move.l    ras_home(pc),BG1_scroll_reg
  752.     rte
  753.  
  754.  
  755. _v_disp4:
  756.     ori.b    #$80,MFP_IERA
  757.     move.l    #__hsync4,H_SYNC_ADR.w
  758.     move.l    page_raster_num(pc),ras
  759.     move.l    ras_home(pc),GR0_scroll_reg
  760.     rte
  761.  
  762.  
  763. _v_disp5:
  764.     ori.b    #$80,MFP_IERA
  765.     move.l    #__hsync5,H_SYNC_ADR.w
  766.     move.l    page_raster_num(pc),ras
  767.     move.l    ras_home(pc),TEXT_scroll_reg
  768.     rte
  769.  
  770.  
  771. _v_disp6:
  772.     ori.b    #$80,MFP_IERA
  773.     move.l    #__hsync6,H_SYNC_ADR.w
  774.     move.l    page_raster_num(pc),ras
  775.     move.l    ras_home(pc),BG0_scroll_reg
  776.     rte
  777.  
  778.  
  779. _v_disp7:
  780.     ori.b    #$80,MFP_IERA
  781.     move.l    #__hsync7,H_SYNC_ADR.w
  782.     move.l    page_raster_num(pc),ras
  783.     move.l    ras_home(pc),BG1_scroll_reg
  784.     rte
  785.  
  786.  
  787. _v_dispG0000:
  788.     ori.b    #$80,MFP_IERA
  789.     move.l    #__hsyncG0000,H_SYNC_ADR.w
  790.     move.l    page_raster_num(pc),ras
  791.     move.l    ras_home(pc),GR0_scroll_reg
  792.     move.l    ras_home(pc),GR1_scroll_reg
  793.     move.l    ras_home(pc),GR2_scroll_reg
  794.     move.l    ras_home(pc),GR3_scroll_reg
  795.     rte
  796.  
  797.  
  798. _v_dispG00:
  799.     ori.b    #$80,MFP_IERA
  800.     move.l    #__hsyncG00,H_SYNC_ADR.w
  801.     move.l    page_raster_num(pc),ras
  802.     move.l    ras_home(pc),GR0_scroll_reg
  803.     move.l    ras_home(pc),GR1_scroll_reg
  804.     rte
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  * BG0 横
  813. __hsync0:
  814.     subq.w    #1,ras1
  815.     bcc    @f
  816.     move.l    #_hsync0,H_SYNC_ADR.w
  817. _hsync0:
  818.     move.l    a0,-(sp)
  819.     movea.l    data(pc),a0
  820.     move.w    (a0),BG0_scroll_reg
  821.     addq.l    #4,a0
  822.     move.l    a0,data
  823.     lea.l    ras(pc),a0
  824.     subq.w    #1,(a0)
  825.     bcs    _hsync_owari
  826.     movea.l    (sp)+,a0
  827. @@:
  828.     rte
  829.  
  830.  
  831.  * BG1 横
  832. __hsync1:
  833.     subq.w    #1,ras1
  834.     bcc    @f
  835.     move.l    #_hsync1,H_SYNC_ADR.w
  836. _hsync1:
  837.     move.l    a0,-(sp)
  838.     movea.l    data(pc),a0
  839.     move.w    (a0),BG1_scroll_reg
  840.     addq.l    #4,a0
  841.     move.l    a0,data
  842.     lea.l    ras(pc),a0
  843.     subq.w    #1,(a0)
  844.     bcs    _hsync_owari
  845.     movea.l    (sp)+,a0
  846. @@:
  847.     rte
  848.  
  849.  
  850.  * BG0 縦横
  851. __hsync2:
  852.     subq.w    #1,ras1
  853.     bcc    @f
  854.     move.l    #_hsync2,H_SYNC_ADR.w
  855. _hsync2:
  856.     move.l    a0,-(sp)
  857.     movea.l    data(pc),a0
  858.     move.l    (a0)+,BG0_scroll_reg
  859.     move.l    a0,data
  860.     lea.l    ras(pc),a0
  861.     subq.w    #1,(a0)
  862.     bcs    _hsync_owari
  863.     movea.l    (sp)+,a0
  864. @@:
  865.     rte
  866.  
  867.  
  868.  * BG1 縦横
  869. __hsync3:
  870.     subq.w    #1,ras1
  871.     bcc    @f
  872.     move.l    #_hsync3,H_SYNC_ADR.w
  873. _hsync3:
  874.     move.l    a0,-(sp)
  875.     movea.l    data(pc),a0
  876.     move.l    (a0)+,BG1_scroll_reg
  877.     move.l    a0,data
  878.     lea.l    ras(pc),a0
  879.     subq.w    #1,(a0)
  880.     bcs    _hsync_owari
  881.     movea.l    (sp)+,a0
  882. @@:
  883.     rte
  884.  
  885.  * GR0
  886. __hsync4:
  887.     subq.w    #1,ras1
  888.     bcc    @f
  889.     move.l    #_hsync4,H_SYNC_ADR.w
  890. _hsync4:
  891.     move.l    a0,-(sp)
  892.     movea.l    data(pc),a0
  893.     move.w    (a0),GR0_scroll_reg
  894.     addq.l    #4,a0
  895.     move.l    a0,data
  896.     lea.l    ras(pc),a0
  897.     subq.w    #1,(a0)
  898.     bcs    _hsync_owari
  899.     movea.l    (sp)+,a0
  900. @@:
  901.     rte
  902.  
  903.  
  904.  * TEXT
  905. __hsync5:
  906.     subq.w    #1,ras1
  907.     bcc    @f
  908.     move.l    #_hsync5,H_SYNC_ADR.w
  909. _hsync5:
  910.     move.l    a0,-(sp)
  911.     movea.l    data(pc),a0
  912.     move.w    (a0),TEXT_scroll_reg
  913.     addq.l    #4,a0
  914.     move.l    a0,data
  915.     lea.l    ras(pc),a0
  916.     subq.w    #1,(a0)
  917.     bcs    _hsync_owari
  918.     movea.l    (sp)+,a0
  919. @@:
  920.     rte
  921.  
  922.  
  923.  * BG0 縦横 差分
  924. __hsync6:
  925.     subq.w    #1,ras1
  926.     bcc    @f
  927.     move.l    #_hsync6,H_SYNC_ADR.w
  928. _hsync6:
  929.     movem.l    d0/a0,-(sp)
  930.     movea.l    data(pc),a0
  931.     move.l    (a0)+,d0
  932.     add.l    d0,BG0_scroll_reg        * ここがポイント
  933.     move.l    (sp)+,d0
  934.     move.l    a0,data
  935.     lea.l    ras(pc),a0
  936.     subq.w    #1,(a0)
  937.     bcs    _hsync_owari
  938.     movea.l    (sp)+,a0
  939. @@:
  940.     rte
  941.  
  942.  
  943.  * BG1 縦横 差分
  944. __hsync7:
  945.     subq.w    #1,ras1
  946.     bcc    @f
  947.     move.l    #_hsync7,H_SYNC_ADR.w
  948. _hsync7:
  949.     movem.l    d0/a0,-(sp)
  950.     movea.l    data(pc),a0
  951.     move.l    (a0)+,d0
  952.     add.l    d0,BG1_scroll_reg        * ここがポイント
  953.     move.l    (sp)+,d0
  954.     move.l    a0,data
  955.     lea.l    ras(pc),a0
  956.     subq.w    #1,(a0)
  957.     bcs    _hsync_owari
  958.     movea.l    (sp)+,a0
  959. @@:
  960.     rte
  961.  
  962.  
  963.  * GR0000 (65536 colors mode)
  964. __hsyncG0000:
  965.     subq.w    #1,ras1
  966.     bcc    @f
  967.     move.l    #_hsyncG0000,H_SYNC_ADR.w
  968. _hsyncG0000:
  969.     move.l    a0,-(sp)
  970.     movea.l    data(pc),a0
  971.     move.w    (a0),GR0_scroll_reg
  972.     move.w    (a0),GR1_scroll_reg
  973.     move.w    (a0),GR2_scroll_reg
  974.     move.w    (a0),GR3_scroll_reg
  975.     addq.l    #4,a0
  976.     move.l    a0,data
  977.     lea.l    ras(pc),a0
  978.     subq.w    #1,(a0)
  979.     bcs    _hsync_owari
  980.     movea.l    (sp)+,a0
  981. @@:
  982.     rte
  983.  
  984.  
  985.  * GR00 (256 colors mode)
  986. __hsyncG00:
  987.     subq.w    #1,ras1
  988.     bcc    @f
  989.     move.l    #_hsyncG00,H_SYNC_ADR.w
  990. _hsyncG00:
  991.     move.l    a0,-(sp)
  992.     movea.l    data(pc),a0
  993.     move.w    (a0),GR0_scroll_reg
  994.     move.w    (a0),GR1_scroll_reg
  995.     addq.l    #4,a0
  996.     move.l    a0,data
  997.     lea.l    ras(pc),a0
  998.     subq.w    #1,(a0)
  999.     bcs    _hsync_owari
  1000.     movea.l    (sp)+,a0
  1001. @@:
  1002.     rte
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013. _hsync_owari:
  1014.     andi.b    #$7f,MFP_IERA        * h-sync  割り込み発生禁止
  1015.     lea.l    page(pc),a0
  1016.     subq.w    #1,(a0)
  1017.     bcc    @f
  1018.     move.w    page0(pc),(a0)        * page
  1019.     move.l    data0(pc),data
  1020.     lea.l    loop_num(pc),a0
  1021.     tst.w    (a0)
  1022.     beq    @f
  1023.     subq.w    #1,(a0)
  1024.     bne    @f
  1025.         move.w    #-1,(a0)    * 終わりの印
  1026. *        move.w    #-1,ras_screen    * 終わりの印
  1027. *        andi.b    #$3f,MFP_IERA        * crtcras  割り込み発生禁止
  1028.         andi.b    #$1f,MFP_IERA        * vdisp以下の 割り込み発生禁止
  1029. @@:
  1030.     movea.l    (sp)+,a0
  1031.     rte
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042. *-----------------------------
  1043. return_zero:
  1044.     moveq.l    #0,d0
  1045. return_d0:
  1046.     lea.l    fac(pc),a0
  1047.     move.l    d0,6(a0)
  1048.     moveq.l    #0,d0
  1049.     rts
  1050. *-----------------------------
  1051. fac:
  1052.     .dc.w    0
  1053.     .dc.l    0
  1054.     .dc.l    0
  1055. *-----------------------------
  1056. para1_err:
  1057.     moveq    #'1',d0
  1058.     bra    @f
  1059. para2_err:
  1060.     moveq    #'2',d0
  1061.     bra    @f
  1062. para3_err:
  1063.     moveq    #'3',d0
  1064.     bra    @f
  1065. para4_err:
  1066.     moveq    #'4',d0
  1067. @@:
  1068.     lea.l    _para_err(pc),a1
  1069.     move.b    d0,(a1)
  1070.     moveq    #1,d0
  1071.     rts
  1072. para0_err:
  1073.     lea.l    _para0_err(pc),a1
  1074.     moveq    #1,d0
  1075.     rts
  1076. no_param:
  1077.     lea.l    _no_param(pc),a1
  1078.     moveq    #1,d0
  1079.     rts
  1080. irregal_screen:
  1081.     lea.l    _irregal_screen(pc),a1
  1082.     moveq    #1,d0
  1083.     rts
  1084. データ未セット:
  1085.     lea.l    _データ未セット(pc),a1
  1086.     moveq    #2,d0
  1087.     rts
  1088. 指定大きすぎ:
  1089.     lea.l    _指定大きすぎ(pc),a1
  1090.     moveq    #3,d0
  1091.     rts
  1092.  
  1093. _para_err:
  1094.     .dc.b    ' 番目の'
  1095. _para0_err:
  1096.     .dc.b    'パラメーターがおかしいです',0
  1097. _no_param:
  1098.     .dc.b    'パラメーターがありません',0
  1099. _irregal_screen:
  1100.     .dc.b    'スクリーンの指定が間違っています',0
  1101. _データ未セット:
  1102.     .dc.b    'スクロールデータがまだ指定されていません',0
  1103. _指定大きすぎ:
  1104.     .dc.b    '配列の要素数より大きな値を指定してます',0
  1105.     .even
  1106. *-----------------------------
  1107.  
  1108.  
  1109.  
  1110.  
  1111.     .end
  1112.